/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import org.cip.esymons.eventos.bc.ArchivosAdjuntosDelegate;
import org.cip.esymons.eventos.bc.MaterialAcademicoDelegate;
import org.cip.esymons.eventos.bc.EntregaMaterialDelegate;
import org.cip.esymons.eventos.bc.MatriculaDelegate;
import org.cip.esymons.eventos.bc.CursoDelegate;
import org.cip.esymons.eventos.bc.PreEventoDelegate;
import org.cip.esymons.eventos.be.ArchivosAdjuntos;
import org.cip.esymons.eventos.be.EntregaMaterial;
import org.cip.esymons.eventos.be.MaterialAcademico;
import org.cip.esymons.eventos.be.Matricula;
import org.cip.esymons.eventos.be.Preevento;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.EnviaEmail;

/**
 *
 * @author Lizardo Rios
 */
public class EntregaMaterialController {

    private EntregaMaterialDelegate delegado;
    private MaterialAcademicoDelegate delegadoMaterialAcademico;
    private MatriculaDelegate delegadoMatricula;
    private CursoDelegate delegadoCurso;
    private ArchivosAdjuntosDelegate delegadoArchivoAdjunto;
    private PreEventoDelegate delegadoPreevento;
    List<EntregaMaterial> listaEntregaMaterial;
    List<MaterialAcademico> listaMaterialAcademico;
    List<Matricula> listaMatricula;
    private Integer codigoCurso;
    private Integer codigoMaterial;
    private Matricula matricula;
    private MaterialAcademico materialAcademico;
    private EntregaMaterial entregaMaterial;
    private PersonaNatural persona;
    private List<Matricula> listaInscritos;
    private List<ArchivosAdjuntos> listaArchivosAdjuntos;
    private ArchivosAdjuntos archivoAdjunto;
    private String dirDocumento;

    private String fileName;
    private String archivo;
    private String rutaZip;


    
    /***************************  Constructor *******************************/
    public EntregaMaterialController() {
        entregaMaterial = new EntregaMaterial();
        delegado = new EntregaMaterialDelegate();
        delegadoMaterialAcademico = new MaterialAcademicoDelegate();
        delegadoMatricula = new MatriculaDelegate();
        delegadoCurso = new CursoDelegate();
        delegadoArchivoAdjunto = new ArchivosAdjuntosDelegate();
        listaEntregaMaterial = new ArrayList<EntregaMaterial>();
        listaMaterialAcademico = new ArrayList<MaterialAcademico>();
        listaMatricula = new ArrayList<Matricula>();
        listaArchivosAdjuntos = new ArrayList<ArchivosAdjuntos>();
        archivoAdjunto = new ArchivosAdjuntos();
//        dirDocumento = "/modulos/eventos/ArchivosAdjuntos/";
        dirDocumento = "D:\\";//Archivos\\";
        //listar();
    }

    public PreEventoDelegate getDelegadoPreevento() {
        return delegadoPreevento;
    }

    public void setDelegadoPreevento(PreEventoDelegate delegadoPreevento) {
        this.delegadoPreevento = delegadoPreevento;
    }

    public String getArchivo() {
        return archivo;
    }

    public void setArchivo(String archivo) {
        this.archivo = archivo;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getRutaZip() {
        return rutaZip;
    }

    public void setRutaZip(String rutaZip) {
        this.rutaZip = rutaZip;
    }

    public String getDirDocumento() {
        return dirDocumento;
    }

    public void setDirDocumento(String dirDocumento) {
        this.dirDocumento = dirDocumento;
    }

    public ArchivosAdjuntos getArchivoAdjunto() {
        return archivoAdjunto;
    }

    public void setArchivoAdjunto(ArchivosAdjuntos archivoAdjunto) {
        this.archivoAdjunto = archivoAdjunto;
    }

    public ArchivosAdjuntosDelegate getDelegadoArchivoAdjunto() {
        return delegadoArchivoAdjunto;
    }

    public void setDelegadoArchivoAdjunto(ArchivosAdjuntosDelegate delegadoArchivoAdjunto) {
        this.delegadoArchivoAdjunto = delegadoArchivoAdjunto;
    }

    public List<ArchivosAdjuntos> getListaArchivosAdjuntos() {
        return listaArchivosAdjuntos;
    }

    public void setListaArchivosAdjuntos(List<ArchivosAdjuntos> listaArchivosAdjuntos) {
        this.listaArchivosAdjuntos = listaArchivosAdjuntos;
    }

    /*************************** Setters and Getters  ***********************/

    public EntregaMaterialDelegate getDelegado() {
        return delegado;
    }

    public List<EntregaMaterial> getListaEntregaMaterial() {
        return listaEntregaMaterial;
    }
    public void setListaEntregaMaterial(List<EntregaMaterial> listaEntregaMaterial) {
        this.listaEntregaMaterial = listaEntregaMaterial;
    }

    public MaterialAcademicoDelegate getDelegadoMaterialAcademico() {
        return delegadoMaterialAcademico;
    }
    public void setDelegadoMaterialAcademico(MaterialAcademicoDelegate delegadoMaterialAcademico) {
        this.delegadoMaterialAcademico = delegadoMaterialAcademico;
    }

    public CursoDelegate getDelegadoCurso() {
        return delegadoCurso;
    }
    public void setDelegadoCurso(CursoDelegate delegadoCurso) {
        this.delegadoCurso = delegadoCurso;
    }

    public Integer getCodigoMaterial() {
        return codigoMaterial;
    }
    public void setCodigoMaterial(Integer codigoMaterial) {
        this.codigoMaterial = codigoMaterial;
    }

    public List<Matricula> getListaMatricula() {
        return listaMatricula;
    }
    public void setListaMatricula(List<Matricula> listaMatricula) {
        this.listaMatricula = listaMatricula;
    }

    public MatriculaDelegate getDelegadoMatricula() {
        return delegadoMatricula;
    }
    public void setDelegadoMatricula(MatriculaDelegate delegadoMatricula) {
        this.delegadoMatricula = delegadoMatricula;
    }

    public Matricula getMatricula() {
        return matricula;
    }
    public void setMatricula(Matricula matricula) {
        this.matricula = matricula;
    }

    public MaterialAcademico getMaterialAcademico() {
        return materialAcademico;
    }
    public void setMaterialAcademico(MaterialAcademico materialAcademico) {
        this.materialAcademico = materialAcademico;
    }

    public PersonaNatural getPersona() {
        return persona;
    }
    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public Integer getCodigoCurso() {
        return codigoCurso;
    }
    public void setCodigoCurso(Integer codigoCurso) {
        this.codigoCurso = codigoCurso;
    }

    public List<Matricula> getListaInscritos() {
        return listaInscritos;
    }
    public void setListaInscritos(List<Matricula> listaInscritos) {
        this.listaInscritos = listaInscritos;
    }

    public EntregaMaterial getEntregaMaterial() {
        return entregaMaterial;
    }
    public void setEntregaMaterial(EntregaMaterial entregaMaterial) {
        this.entregaMaterial = entregaMaterial;
    }

     public List<MaterialAcademico> getListaMaterialAcademico() {
        return listaMaterialAcademico;
    }
    public void setListaMaterialAcademico(List<MaterialAcademico> listaMaterialAcademico) {
        this.listaMaterialAcademico = listaMaterialAcademico;
    }

    /**********************************  Metodos  *****************************/
    public String guardarEntregas() {
        for (EntregaMaterial entrega : listaEntregaMaterial) {
            entrega.setMatCodigo(entrega.getMatCodigo());
            materialAcademico = delegadoMaterialAcademico.find(codigoMaterial);
            entrega.setMacCodigo(materialAcademico);
            delegado.edit(entrega);
        }
        return listar();
    }

    public String listar() {
        listaEntregaMaterial = delegado.listarEntregaMaterial(codigoCurso, codigoMaterial);
        return "";
    }

    public String mostrarEntregas() {
        persona = new PersonaNatural();
        System.out.println("codigoCurso: " + codigoCurso);
        System.out.println("codigoMaterial: " + codigoMaterial);
        codigoCurso = (codigoCurso == null) ? 0 : codigoCurso;
        codigoMaterial = (codigoMaterial == null) ? 0 : codigoMaterial;
        //buscar participantes, si existen verificar sus entregas
        listaInscritos = delegadoMatricula.listarMatriculadosXCurso(codigoCurso);
        if (!listaInscritos.isEmpty()) {
            System.out.println("OK.....LISTA NO NULA");
            listaMatricula = delegado.listarMatriculadosAEntregar(codigoCurso, codigoMaterial);
            insertarEntregasFaltantes();
        }
        listaEntregaMaterial = delegado.listarEntregaMaterial(codigoCurso, codigoMaterial);
        return "";
    }

    public String validarCodigoCurso() {
        codigoCurso = (codigoCurso == null) ? 0 : codigoCurso;
        listaArchivosPorCurso();
        return null;
    }

    public String cancelar() {
        entregaMaterial = new EntregaMaterial();
        listaEntregaMaterial = new ArrayList<EntregaMaterial>();
        listaMaterialAcademico = new ArrayList<MaterialAcademico>();
        listaMatricula = new ArrayList<Matricula>();
        listaArchivosAdjuntos = new ArrayList<ArchivosAdjuntos>();
        codigoCurso = 0;
        codigoMaterial = 0;
        return null;
    }

    public String insertarEntregasFaltantes() {
        MaterialAcademico material = delegadoMaterialAcademico.find(codigoMaterial);
        if (material != null) {
            for (Matricula m : listaMatricula) {
                EntregaMaterial e = new EntregaMaterial();
                e.setMacCodigo(material);           //material
                e.setMatCodigo(m);                  //matriculados
                e.setEmaEstado(false);              //entregas
                e.setEmaActivo(true);               //activo
                System.out.println("Codigo: " + e.getEmaCodigo());
                System.out.println("Matricula: " + e.getMatCodigo());
                System.out.println("Material: " + e.getMacCodigo());
                System.out.println("Entrega: " + e.getEmaEstado());
                System.out.println("Activo: " + e.getEmaActivo());
                delegado.create(e);
                e = null;
            }
            material = null;
        }
        return listar();
    }


    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public SelectItem[] getComboCursos() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<Preevento> listaCurso = delegadoCurso.listarCursosEnProceso();
            selects = new SelectItem[listaCurso.size()];
            int cont = 0;
            for (Preevento preevento : listaCurso) {
                SelectItem item = new SelectItem(preevento.getPreCodigo(), preevento.getPreNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Cursos");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboMaterialAcademico() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //codigoEvento = 3; //borrar esta linea
            System.out.println("codigoCurso: " + codigoCurso);
            List<MaterialAcademico> listaMaterial = delegadoMaterialAcademico.listarMaterialesXCurso(codigoCurso);
            selects = new SelectItem[listaMaterial.size()];
            int cont = 0;
            for (MaterialAcademico material : listaMaterial) {
                SelectItem item = new SelectItem(material.getMacCodigo(), material.getMacTitulo());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen materiales académicos");
            selects[0] = item;
            return selects;
        }
    }

    public List<ArchivosAdjuntos> listaArchivosPorCurso(){

        try{
            listaArchivosAdjuntos = new ArrayList<ArchivosAdjuntos>();
            listaArchivosAdjuntos = delegadoArchivoAdjunto.listaArchivosPorCurso(codigoCurso);
            for(ArchivosAdjuntos arch : listaArchivosAdjuntos){

                arch.setSeleccionado(true);
            }

            return listaArchivosAdjuntos;
        }catch(Exception ex){
            return null;
        }
    }

    public String removerArchivo(){

        try {
             delegadoArchivoAdjunto.remove(archivoAdjunto);
             archivoAdjunto = new ArchivosAdjuntos();
             listaArchivosPorCurso();
             return null;

        } catch (Exception e) {
            return null;
        }
    }


    // subir archivo

    private UploadedFile upFile;
    boolean rendSuccess = false;
    boolean rendFailure = false;
    private String imagen;

    public boolean isRendFailure() {
        return rendFailure;
    }

    public void setRendFailure(boolean rendFailure) {
        this.rendFailure = rendFailure;
    }

    public boolean isRendSuccess() {
        return rendSuccess;
    }

    public void setRendSuccess(boolean rendSuccess) {
        this.rendSuccess = rendSuccess;
    }

    public UploadedFile getUpFile() {
        return upFile;
    }

    public void setUpFile(UploadedFile upFile) {
        this.upFile = upFile;
    }

    public String getImagen() {
        return imagen;
    }

    public void setImagen(String imagen) {
        this.imagen = imagen;
    }

    public String upload() throws IOException {

//        String extension;
//        dirDocumento = "/modulos/eventos/ArchivosAdjuntos/";
        dirDocumento = "D:\\"; //Archivos\\";
        try {
            System.out.println("ruta :"+ dirDocumento);
//                extension = upFile.getName().substring(upFile.getName().length()-4,upFile.getName().length());
                InputStream stream = upFile.getInputStream();
                dirDocumento = dirDocumento+upFile.getName();
                OutputStream out=new FileOutputStream(dirDocumento);
//                dirImagen = dirImagen.concat(colegiado.getPersonaNatural().getPerNroDNI().concat(extension));
//                OutputStream out=new FileOutputStream(dirDocumento);
                System.out.println("ruta :"+ dirDocumento);
                long size = upFile.getSize();
                byte[] buffer = new byte[(int) size];
                stream.read(buffer, 0, (int) size);
                out.write(buffer, 0, (int) size);
                stream.close();
                out.close();
                guardarArchivoAdjunto();
                rendSuccess = true;
                rendFailure = false;
                setImagen(upFile.getName());
                System.out.println("File Upload Successful.");
                return "ok";

        } catch (Exception ioe) {
            System.out.println("File Upload Unsuccessful.");
            System.out.println("errorrrr" + ioe.toString());
            rendSuccess = false;
            rendFailure = true;
            return "no";
        }
    }

    public String guardarArchivoAdjunto(){

        try{            
            archivoAdjunto.setAdjRuta(dirDocumento);
            archivoAdjunto.setAdjEstado(true);
            archivoAdjunto.setAdjfechaRegistro(new Date());
            archivoAdjunto.setCurCodigo(codigoCurso);
            delegadoArchivoAdjunto.create(archivoAdjunto);
            
            archivoAdjunto = new ArchivosAdjuntos();
//            dirDocumento = "/modulos/eventos/ArchivosAdjuntos/";
            dirDocumento = "D:\\"; //Archivos\\";
            listaArchivosPorCurso();
            return null;
        }catch(Exception ex){
            return null;
        }
    }


    public void crearArchivoZip() throws IOException
    {
        try {
            fileName = null;
            fileName = "Archivos.zip";
            archivo = null;
            archivo = dirDocumento+fileName;

            FileOutputStream destFoto = new FileOutputStream(archivo);
            ZipOutputStream ArchAdjunto = new ZipOutputStream(new BufferedOutputStream(destFoto));

//            listaArchivosPorCurso();
            System.out.println("tamaño lista : "+listaArchivosAdjuntos.size());

            for(ArchivosAdjuntos arch : listaArchivosAdjuntos){
                System.out.println("seleccion : "+arch.getSeleccionado());
                if(arch.getSeleccionado()){

                    System.out.println("ruta archivo : "+arch.getAdjRuta());
                        File file = new File(arch.getAdjRuta());
                        System.out.println("file : "+ file.getName());
                        FileInputStream im = new FileInputStream(arch.getAdjRuta());
                        ZipEntry ze = new ZipEntry(file.getName());
//                        ZipEntry ze = new ZipEntry(arch.getAdjnombreArchivo()+".doc");
                        ArchAdjunto.putNextEntry(ze);
                        
                        /*Lectura y escritura con un buffer del origen al archivo .zip*/
                        BufferedInputStream origin = new BufferedInputStream(im, 1024);
                        byte[] data = new byte[1024];
                        int count;
                        while( ( count = origin.read(data, 0, 1024) ) != -1 )
                        {
                            ArchAdjunto.write(data, 0, count);
                        }
                        origin.close();
                    }
                }
            
          ArchAdjunto.close();
          guardarArchivoZip();
          System.out.println("archivo zip : "+archivo);
        } catch (Exception e) {
            System.out.println("error: "+e.getMessage());
        }
    }

   public String guardarArchivoZip(){

        try{ 
            archivoAdjunto.setAdjnombreArchivo("Archivo ZIP");
            archivoAdjunto.setAdjRuta(archivo);
            archivoAdjunto.setAdjEstado(true);
            archivoAdjunto.setAdjfechaRegistro(new Date());
            archivoAdjunto.setCurCodigo(codigoCurso);
            delegadoArchivoAdjunto.create(archivoAdjunto);

            archivoAdjunto = new ArchivosAdjuntos();
//            dirDocumento = "/modulos/eventos/ArchivosAdjuntos/";
            dirDocumento = "D:\\"; //Archivos\\";
            listaArchivosPorCurso();
            return null;
        }catch(Exception ex){
            return null;
        }
    }

        //METODO PARA ENVIAR MAIL A LOS DIRECTIVOS
    public String enviarEmail(){

//        String ruta = "D:\\esymons\\Codigo\\org.cip.esymons\\org.cip.esymons.colegiatura\\web\\Archivos\\";
        HttpServletRequest request = ControladorAbstracto.getRequest();
        String Imagen = "/imagenColegiatura/LogoCorreo.gif";
        String rutaImagen = request.getRealPath(Imagen);
        String to,from,title,text, mensaje;
        from = "infocip@cip.org.pe";
        mensaje = "";
        String adjunto;

        try{
//
            InputStream stream = upFile.getInputStream();
            OutputStream out=new FileOutputStream(archivo);
            long size = upFile.getSize();
            byte[] buffer = new byte[(int) size];
            stream.read(buffer, 0, (int) size);
            out.write(buffer, 0, (int) size);
            stream.close();
//            adjunto = archivo.toString();
            adjunto = dirDocumento+upFile.getName().toString() ;
            out.close();
            rendSuccess = true;
            rendFailure = false;
            System.out.println("File Upload Successful.");

        for(EntregaMaterial material: listaEntregaMaterial){
         //verificar si fue seleccionado para enviarle el mail
         if(material.getSeleccion()==true){
           //verificar a que correo se le envia el mail
               if(material.getMatCodigo().getPreinscripcionEvento().getPerCodigo().getSolcorreopersonal1()!=null && !material.getMatCodigo().getPreinscripcionEvento().getPerCodigo().getSolcorreopersonal1().isEmpty()){
                   to = material.getMatCodigo().getPreinscripcionEvento().getPerCodigo().getSolcorreopersonal1();
                   title = "Documentos del Curso";
                   text = "Sr."+material.getMatCodigo().getPreinscripcionEvento().getPerCodigo().getNombreCompleto()+" se le etsa enviando el material referente al curso";
//                   mensaje = EnviaEmail.envia(from, to, title, text, rutaImagen);
                   System.out.println("mensaje : se envio correctamente");
//                   System.out.println("adjunto : "+adjunto);
                   mensaje = EnviaEmail.enviaAdjunto(from, to, title, text, adjunto, rutaImagen);
               }
           }
          System.out.println("mensaje : "+mensaje);
         }
            from = "";
            title = "";
            text = "";
        return null;

       }catch(Exception ex){
//            System.out.println("File Upload Unsuccessful.");
//            System.out.println("errorrrr" + ex.toString());
//            rendSuccess = false;
//            rendFailure = true;
            return null;
       }
    }

        public String mostrarArchivo() {

        try {
            File file = new File(archivoAdjunto.getAdjRuta());
            FacesContext fcontext = FacesContext.getCurrentInstance();
            ExternalContext eContext = fcontext.getExternalContext();
            HttpServletResponse response = (HttpServletResponse) eContext.getResponse();
            response.setHeader("Content-Disposition", "inline; filename=" + file.getName());
            response.setHeader("Cache-Control", "public");
            response.setContentType("application/" + archivoAdjunto.getAplication());
            OutputStream os = response.getOutputStream();
            FileInputStream inputStream = new FileInputStream(file);
            int tamanoInput = inputStream.available();
            byte[] datosPDF = new byte[tamanoInput];
            inputStream.read(datosPDF, 0, tamanoInput);
            os.write(datosPDF, 0, tamanoInput);
            os.close();
            fcontext.responseComplete();

        } catch (Exception e) {
            return "";
        }
        return "";
    }
    



}
